#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>
#include <sys/wait.h>

#define NUM 1024 //保存用户在命令行输入的内容
#define PARSE_NUM 20 //保存命令行解析的结果
int main()
{
  char cmd[NUM] = {0};
  char* argv[PARSE_NUM] = {0};
  while(1)
  {

    //0.输出显示符
    printf("[who@host mydir]");
    fflush(stdout);
    
    //1.获取用户命令行输入
    fgets(cmd,sizeof(cmd)-1,stdin);//从键盘当中读取 
    cmd[strlen(cmd) - 1] = '\0'; //ls\n\0 ==>ls\0\0
    
    //2.解析命令行
    const char* seq = " ";
    argv[0] = strtok(cmd,seq); 
    int index = 1;
    while(argv[index] = strtok(NULL,seq)) index++;
    
    //for(int i = 0;argv[i];i++)
      //printf("%s\n",argv[i]);
    
    //3.判断执行的是否是内建命令
    if(strcmp("cd",argv[0]) == 0)
    {
      chdir(argv[1]);
      continue;
    }

    //4.创建子进程
    if(fork() == 0)
    {  
      //5.执行程序替换
      execvp(argv[0],argv);
      exit(1); //程序替换执行成功，不会来到这里
    }
    
    //6.等待子进程退出
    int status = 0;
    waitpid(-1,&status,0);

    //7.打印子进程的退出信息
    //低16位：低7位：信号 第8位：coredump是否开启  高8位：退出码
    printf("exitCode:%d,exitSignal:%d,coreDump:%d\n", (status >> 8) &0xff,status & 0xff,(status >> 7) & 1);
  }
  return 0;
}
